package net.wofly.cashier.order.service;

import com.alipay.api.AlipayApiException;
import net.wofly.cashier.order.domain.Order;
import net.wofly.cashier.order.domain.OrderContent;
import net.wofly.cashier.table.domain.Table;
import net.wofly.framework.util.ReturnBean;

import java.io.IOException;
import java.util.List;

public interface ICashierOrderService {

	/**
	 * 增加或修改
	 * 
	 * @param entity
	 * @return
	 */
	public Order save(Order entity);

	/**
	 * 删除
	 * 
	 * @param entity
	 * @return
	 */
	public void delete(Order entity);

	/**
	 * 根据主键ID删除
	 * 
	 * @param key
	 * @return
	 */
	public void delete(String key);

	/**
	 * 根据主键查询
	 * 
	 * @param key
	 * @return
	 */
	public Order findOne(String key);
	
	public List<Order> save(List<Order> entityList) ;
	
	/**
	 * 加菜
	 * <ul>
	 * 	<li>加菜是判断当前订单的状态</li>
	 * 	<li>加菜时要判断当前是否为结账状态，如果未结账则将订单状态修改为加菜状态，同时增加加菜时间；如果己结账，则将订单状态修改为加菜未结账状态</li>
	 * 	<li>判断所加菜是否有库存，有库存加菜才能成功。加菜成功的同时减去相应的库存</li>
	 * 	<li>加菜没有库存时，提示用户</li>
	 * 	<li>当没有任何加菜成功时，不修改当前订单的状态</li>
	 * </ul>
	 *
	 * @param orderID
	 * @param orderContents
	 */
	public ReturnBean<Order> addDish(String orderID, List<OrderContent> orderContents);
	
	/**
	 * 收桌
	 * <ul>
	 * 	<li>将当前桌子恢复为空闲状态</li>
	 * 	<li></li>
	 * </ul>
	 *
	 * @param tableID
	 */
	public ReturnBean<String> cleanTable(String tableID);
	
	/**
	 * 开台
	 * <ul>
	 * 	<li>新开一个餐桌</li>
	 * 	<li>验证当前餐桌是否有预约或预购</li>
	 * 	<li></li>
	 * </ul>
	 *
	 * @param tableID
	 */
	public ReturnBean<Table> openTable(String tableID);
	
	/**
	 * 结账
	 * <ul>
	 * 	<li>判断当前订单状态</li>
	 * 	<li>计算计算中所有未结账的菜品总额与前端传递过来金额进行核实，如果相等则进行后一步支付；如果不等时，提示用户</li>
	 * 	<li></li>
	 * </ul>
	 *
	 * @param orderID
	 * @param payType
	 * @param sum
	 * @param payAccount
	 */
	public ReturnBean<String> pay(String orderID, Integer payType,Integer clientType, Integer sum, String payAccount) throws IOException, AlipayApiException;
	
	
	public ReturnBean<String> pay(String orderID, Integer payType, Integer clientType) throws IOException, AlipayApiException;
	/**
	 * 下单
	 * <ul>
	 * 	<li>新增一个订单</li>
	 * 	<li>同时修改订单所在餐桌的状态</li>
	 * 	<li>判断每一个菜当前有库存。没有库存的提示用户，有库存的直接下单</li>
	 * 	<li>下单成功的同时，减去对应的菜品库存</li>
	 * </ul>
	 *
	 * @param order
	 */
	public ReturnBean<Order> placeOrder(Order order, Integer callType);
	
}
